/**
 * Scanner.js allows users to scan documents from scanners within browsers.
 * Visit: http://asprise.com/document-scan-upload-image-browser
 *
 * Copyright (c) 2014-present, Asprise Pte Ltd. All rights reserved.
 *
 * NOTICE: All information contained herein is, and remains the property of Asprise
 * Pte Ltd. The intellectual and technical concepts contained herein are proprietary
 * to Asprise and they are protected by trade secret and copyright laws.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

(function() {
    var modelsToAppendToBodyFromDeployJava = [];
    var s = null;
    var deployJava = (function() {
        function e(e) {
            h.debug && (console.log ? console.log(e) : alert(e));
        }
        function t(e, t) {
            if (null == e || 0 == e.length) {
                return !0;
            }
            var n = e.charAt(e.length - 1);
            if ("+" != n && "*" != n && -1 != e.indexOf("_") && "_" != n && (e += "*", n = "*"), e = e.substring(0, e.length - 1), e.length > 0) {
                var i = e.charAt(e.length - 1);
                ("." == i || "_" == i) && (e = e.substring(0, e.length - 1));
            }
            return "*" == n ? 0 == t.indexOf(e) : "+" == n ? t >= e : !1;
        }
        function n() {
            var e = "//java.com/js/webstart.png";
            try {
                return -1 != document.location.protocol.indexOf("http") ? e : "http:" + e;
            } catch (t) {
                return "http:" + e;
            }
        }
        function i(e) {
            var t = "http://java.com/dt-redirect";
            return null == e || 0 == e.length ? t : ("&" == e.charAt(0) && (e = e.substring(1, e.length)), t + "?" + e);
        }
        function r(e, t) {
            for (var n = e.length, i = 0; n > i; i++) {
                if (e[i] === t) {
                    return !0;
                }
            }
            return !1;
        }
        function a(e) {
            return r(u, e.toLowerCase());
        }
        function l(e) {
            return "MSIE" != deployJava.browserName ? !0 : deployJava.compareVersionToPattern(deployJava.getPlugin().version, ["10", "0", "0"], !1, !0) ? !0 : null == e ? !1 : !t("1.6.0_33+", e);
        }
        var o = {
                core: ["id", "class", "title", "style"],
                i18n: ["lang", "dir"],
                events: ["onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover", "onmousemove", "onmouseout", "onkeypress", "onkeydown", "onkeyup"],
                applet: ["codebase", "code", "name", "archive", "object", "width", "height", "alt", "align", "hspace", "vspace"],
                object: ["classid", "codebase", "codetype", "data", "type", "archive", "declare", "standby", "height", "width", "usemap", "name", "tabindex", "align", "border", "hspace", "vspace"]
            },
            u = (o.object.concat(o.core, o.i18n, o.events), o.applet.concat(o.core)),
            h = {
                debug: null,
                version: "20120801",
                firefoxJavaVersion: null,
                myInterval: null,
                preInstallJREList: null,
                returnPage: null,
                brand: null,
                locale: null,
                installType: null,
                EAInstallEnabled: !1,
                EarlyAccessURL: null,
                oldMimeType: "application/npruntime-scriptable-plugin;DeploymentToolkit",
                mimeType: "application/java-deployment-toolkit",
                launchButtonPNG: n(),
                browserName: null,
                browserName2: null,
                getJREs: function() {
                    var t = new Array;
                    if (this.isPluginInstalled()) {
                        for (var n = this.getPlugin(), i = n.jvms, r = 0; r < i.getLength(); r++) {
                            t[r] = i.get(r).version;
                        }
                    } else {
                        var a = this.getBrowser();
                        "MSIE" == a ? this.testUsingActiveX("1.7.0") ? t[0] = "1.7.0" : this.testUsingActiveX("1.6.0") ? t[0] = "1.6.0" : this.testUsingActiveX("1.5.0") ? t[0] = "1.5.0" : this.testUsingActiveX("1.4.2") ? t[0] = "1.4.2" : this.testForMSVM() && (t[0] = "1.1") : "Netscape Family" == a && (this.getJPIVersionUsingMimeType(), null != this.firefoxJavaVersion ? t[0] = this.firefoxJavaVersion : this.testUsingMimeTypes("1.7") ? t[0] = "1.7.0" : this.testUsingMimeTypes("1.6") ? t[0] = "1.6.0" : this.testUsingMimeTypes("1.5") ? t[0] = "1.5.0" : this.testUsingMimeTypes("1.4.2") ? t[0] = "1.4.2" : "Safari" == this.browserName2 && (this.testUsingPluginsArray("1.7.0") ? t[0] = "1.7.0" : this.testUsingPluginsArray("1.6") ? t[0] = "1.6.0" : this.testUsingPluginsArray("1.5") ? t[0] = "1.5.0" : this.testUsingPluginsArray("1.4.2") && (t[0] = "1.4.2")));
                    }
                    if (this.debug) {
                        for (var r = 0; r < t.length; ++r) {
                            e("[getJREs()] We claim to have detected Java SE " + t[r]);
                        }
                    }
                    return t;
                },
                installJRE: function(e, t) {
                    if (this.isPluginInstalled() && this.isAutoInstallEnabled(e)) {
                        var n = !1;
                        return n = this.isCallbackSupported() ? this.getPlugin().installJRE(e, t) : this.getPlugin().installJRE(e), n && (this.refresh(), null != this.returnPage && (document.location = this.returnPage)), n;
                    }
                    return this.installLatestJRE();
                },
                isAutoInstallEnabled: function(e) {
                    return this.isPluginInstalled() ? ("undefined" == typeof e && (e = null), l(e)) : !1;
                },
                isCallbackSupported: function() {
                    return this.isPluginInstalled() && this.compareVersionToPattern(this.getPlugin().version, ["10", "2", "0"], !1, !0);
                },
                installLatestJRE: function(e) {
                    if (this.isPluginInstalled() && this.isAutoInstallEnabled()) {
                        var t = !1;
                        return t = this.isCallbackSupported() ? this.getPlugin().installLatestJRE(e) : this.getPlugin().installLatestJRE(), t && (this.refresh(), null != this.returnPage && (document.location = this.returnPage)), t;
                    }
                    var n = this.getBrowser(),
                        r = navigator.platform.toLowerCase();
                    return "true" == this.EAInstallEnabled && -1 != r.indexOf("win") && null != this.EarlyAccessURL ? (this.preInstallJREList = this.getJREs(), null != this.returnPage && (this.myInterval = setInterval("deployJava.poll()", 3000)), location.href = this.EarlyAccessURL, !1) : "MSIE" == n ? this.IEInstall() : "Netscape Family" == n && -1 != r.indexOf("win32") ? this.FFInstall() : (location.href = i((null != this.returnPage ? "&returnPage=" + this.returnPage : "") + (null != this.locale ? "&locale=" + this.locale : "") + (null != this.brand ? "&brand=" + this.brand : "")), !1);
                },
                runApplet: function(t, n, i) {
                    ("undefined" == i || null == i) && (i = "1.1");
                    var r = i.match("^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:[_\\.](\\d+))?)?)?" + "$");
                    if (null == this.returnPage && (this.returnPage = document.location), null != r) {
                        var a = this.getBrowser();
                        "?" != a ? this.versionCheck(i + "+") ? this.writeAppletTag(t, n) : this.installJRE(i + "+") && (this.refresh(), location.href = document.location, this.writeAppletTag(t, n)) : this.writeAppletTag(t, n);
                    } else {
                        e("[runApplet()] Invalid minimumVersion argument to runApplet():" + i);
                    }
                },
                writeAppletTag: function(e, t) {
                    var n = "<applet ",
                        i = "",
                        r = "</applet>",
                        s = !0;
                    (null == t || "object" != typeof t) && (t = new Object);
                    for (var l in e) {
                        a(l) ? (n += " " + l + '="' + e[l] + '"', "code" == l && (s = !1)) : t[l] = e[l];
                    }
                    var o = !1;
                    for (var u in t) {
                        "codebase_lookup" == u && (o = !0), ("object" == u || "java_object" == u || "java_code" == u) && (s = !1), i += '<param name="' + u + '" value="' + t[u] + '"/>';
                    }
                    o || (i += '<param name="codebase_lookup" value="false"/>'), s && (n += ' code="dummy"'), n += ">", document.write(n + "\n" + i + "\n" + r);
                },
                versionCheck: function(t) {
                    var n = 0,
                        i = t.match("^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:[_\\.](\\d+))?)?)?" + "(\\*|\\+)?$");
                    if (null != i) {
                        for (var r = !1, a = !1, s = new Array, l = 1; l < i.length; ++l) {
                            "string" == typeof i[l] && "" != i[l] && (s[n] = i[l], n++);
                        }
                        "+" == s[s.length - 1] ? (a = !0, r = !1, s.length--) : "*" == s[s.length - 1] ? (a = !1, r = !0, s.length--) : s.length < 4 && (a = !1, r = !0);
                        for (var o = this.getJREs(), l = 0; l < o.length; ++l) {
                            if (this.compareVersionToPattern(o[l], s, r, a)) {
                                return !0;
                            }
                        }
                        return !1;
                    }
                    var u = "Invalid versionPattern passed to versionCheck: " + t;
                    return e("[versionCheck()] " + u), alert(u), !1;
                },
                isWebStartInstalled: function(t) {
                    var n = this.getBrowser();
                    if ("?" == n) {
                        return !0;
                    }("undefined" == t || null == t) && (t = "1.4.2");
                    var i = !1,
                        r = t.match("^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:[_\\.](\\d+))?)?)?" + "$");
                    return null != r ? i = this.versionCheck(t + "+") : (e("[isWebStartInstaller()] Invalid minimumVersion argument to isWebStartInstalled(): " + t), i = this.versionCheck("1.4.2+")), i;
                },
                getJPIVersionUsingMimeType: function() {
                    for (var e = 0; e < navigator.mimeTypes.length; ++e) {
                        var t = navigator.mimeTypes[e].type,
                            n = t.match(/^application\/x-java-applet;jpi-version=(.*)$/);
                        if (null != n && (this.firefoxJavaVersion = n[1], "Opera" != this.browserName2)) {
                            break;
                        }
                    }
                },
                launchWebStartApplication: function(e) {
                    navigator.userAgent.toLowerCase();
                    if (this.getJPIVersionUsingMimeType(), 0 == this.isWebStartInstalled("1.7.0") && (0 == this.installJRE("1.7.0+") || 0 == this.isWebStartInstalled("1.7.0"))) {
                        return !1;
                    }
                    var t = null;
                    document.documentURI && (t = document.documentURI), null == t && (t = document.URL);
                    var n, i = this.getBrowser();
                    if ("MSIE" == i ? n = '<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="0" height="0"><PARAM name="launchjnlp" value="' + e + '"><PARAM name="docbase" value="' + encodeURIComponent(t) + '"></object>' : "Netscape Family" == i && (n = '<embed type="application/x-java-applet;jpi-version=' + this.firefoxJavaVersion + '" width="0" height="0" launchjnlp="' + e + '"docbase="' + encodeURIComponent(t) + '" />'), "undefined" == document.body || null == document.body) {
                        document.write(n), document.location = t;
                    } else {
                        var r = document.createElement("div");
                        r.id = "div1", r.style.position = "relative", r.style.left = "-10000px", r.style.margin = "0px auto", r.className = "dynamicDiv", r.innerHTML = n, document.body.appendChild(r);
                    }
                },
                createWebStartLaunchButtonEx: function(e, t) {
                    null == this.returnPage && (this.returnPage = e);
                    var n = "javascript:deployJava.launchWebStartApplication('" + e + "');";
                    document.write('<a href="' + n + '" onMouseOver="window.status=\'\'; return true;"><img src="' + this.launchButtonPNG + '" border="0" /></a>');
                },
                createWebStartLaunchButton: function(e, t) {
                    null == this.returnPage && (this.returnPage = e);
                    var n = "javascript:if (!deployJava.isWebStartInstalled(&quot;" + t + "&quot;)) {if (deployJava.installLatestJRE()) {if (deployJava.launch(&quot;" + e + "&quot;)) {}}} else {if (deployJava.launch(&quot;" + e + "&quot;)) {}}";
                    document.write('<a href="' + n + '" onMouseOver="window.status=\'\'; return true;"><img src="' + this.launchButtonPNG + '" border="0" /></a>');
                },
                launch: function(e) {
                    return document.location = e, !0;
                },
                isPluginInstalled: function() {
                    var e = this.getPlugin();
                    return e && e.jvms ? !0 : !1;
                },
                isAutoUpdateEnabled: function() {
                    return this.isPluginInstalled() ? this.getPlugin().isAutoUpdateEnabled() : !1;
                },
                setAutoUpdateEnabled: function() {
                    return this.isPluginInstalled() ? this.getPlugin().setAutoUpdateEnabled() : !1;
                },
                setInstallerType: function(e) {
                    return this.installType = e, this.isPluginInstalled() ? this.getPlugin().setInstallerType(e) : !1;
                },
                setAdditionalPackages: function(e) {
                    return this.isPluginInstalled() ? this.getPlugin().setAdditionalPackages(e) : !1;
                },
                setEarlyAccess: function(e) {
                    this.EAInstallEnabled = e;
                },
                isPlugin2: function() {
                    if (this.isPluginInstalled() && this.versionCheck("1.6.0_10+")) {
                        try {
                            return this.getPlugin().isPlugin2();
                        } catch (e) {}
                    }
                    return !1;
                },
                allowPlugin: function() {
                    this.getBrowser();
                    var e = "Safari" != this.browserName2 && "Opera" != this.browserName2;
                    return e;
                },
                getPlugin: function() {
                    this.refresh();
                    var e = null;
                    return this.allowPlugin() && (e = document.getElementById("deployJavaPlugin")), e;
                },
                compareVersionToPattern: function(e, t, n, i) {
                    if (void 0 == e || void 0 == t) {
                        return !1;
                    }
                    var r = e.match("^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:[_\\.](\\d+))?)?)?" + "$");
                    if (null != r) {
                        for (var a = 0, s = new Array, l = 1; l < r.length; ++l) {
                            "string" == typeof r[l] && "" != r[l] && (s[a] = r[l], a++);
                        }
                        var o = Math.min(s.length, t.length);
                        if (i) {
                            for (var l = 0; o > l; ++l) {
                                var u = parseInt(s[l]),
                                    h = parseInt(t[l]);
                                if (h > u) {
                                    return !1;
                                }
                                if (u > h) {
                                    return !0;
                                }
                            }
                            return !0;
                        }
                        for (var l = 0; o > l; ++l) {
                            if (s[l] != t[l]) {
                                return !1;
                            }
                        }
                        return n ? !0 : s.length == t.length;
                    }
                    return !1;
                },
                getBrowser: function() {
                    if (null == this.browserName) {
                        var t = navigator.userAgent.toLowerCase();
                        e("[getBrowser()] navigator.userAgent.toLowerCase() -> " + t), -1 != t.indexOf("msie") && -1 == t.indexOf("opera") ? (this.browserName = "MSIE", this.browserName2 = "MSIE") : -1 != t.indexOf("trident") || -1 != t.indexOf("Trident") ? (this.browserName = "MSIE", this.browserName2 = "MSIE") : -1 != t.indexOf("iphone") ? (this.browserName = "Netscape Family", this.browserName2 = "iPhone") : -1 != t.indexOf("firefox") && -1 == t.indexOf("opera") ? (this.browserName = "Netscape Family", this.browserName2 = "Firefox") : -1 != t.indexOf("chrome") ? (this.browserName = "Netscape Family", this.browserName2 = "Chrome") : -1 != t.indexOf("safari") ? (this.browserName = "Netscape Family", this.browserName2 = "Safari") : -1 != t.indexOf("mozilla") && -1 == t.indexOf("opera") ? (this.browserName = "Netscape Family", this.browserName2 = "Other") : -1 != t.indexOf("opera") ? (this.browserName = "Netscape Family", this.browserName2 = "Opera") : (this.browserName = "?", this.browserName2 = "unknown"), e("[getBrowser()] Detected browser name:" + this.browserName + ", " + this.browserName2);
                    }
                    return this.browserName;
                },
                testUsingActiveX: function(t) {
                    var n = "JavaWebStart.isInstalled." + t + ".0";
                    if ("undefined" == typeof ActiveXObject || !ActiveXObject) {
                        return e("[testUsingActiveX()] Browser claims to be IE, but no ActiveXObject object?"), !1;
                    }
                    try {
                        return null != new ActiveXObject(n);
                    } catch (i) {
                        return !1;
                    }
                },
                testForMSVM: function() {
                    var e = "{08B0E5C0-4FCB-11CF-AAA5-00401C608500}";
                    if ("undefined" != typeof oClientCaps) {
                        var t = oClientCaps.getComponentVersion(e, "ComponentID");
                        return "" == t || "5,0,5000,0" == t ? !1 : !0;
                    }
                    return !1;
                },
                testUsingMimeTypes: function(t) {
                    if (!navigator.mimeTypes) {
                        return e("[testUsingMimeTypes()] Browser claims to be Netscape family, but no mimeTypes[] array?"), !1;
                    }
                    for (var n = 0; n < navigator.mimeTypes.length; ++n) {
                        s = navigator.mimeTypes[n].type;
                        var i = s.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);
                        if (null != i && this.compareVersions(i[1], t)) {
                            return !0;
                        }
                    }
                    return !1;
                },
                testUsingPluginsArray: function(e) {
                    if (!navigator.plugins || !navigator.plugins.length) {
                        return !1;
                    }
                    for (var t = navigator.platform.toLowerCase(), n = 0; n < navigator.plugins.length; ++n) {
                        if (s = navigator.plugins[n].description, -1 != s.search(/^Java Switchable Plug-in (Cocoa)/)) {
                            if (this.compareVersions("1.5.0", e)) {
                                return !0;
                            }
                        } else {
                            if (-1 != s.search(/^Java/) && -1 != t.indexOf("win") && (this.compareVersions("1.5.0", e) || this.compareVersions("1.6.0", e))) {
                                return !0;
                            }
                        }
                    }
                    return this.compareVersions("1.5.0", e) ? !0 : !1;
                },
                IEInstall: function() {
                    return location.href = i((null != this.returnPage ? "&returnPage=" + this.returnPage : "") + (null != this.locale ? "&locale=" + this.locale : "") + (null != this.brand ? "&brand=" + this.brand : "")), !1;
                },
                done: function(e, t) {},
                FFInstall: function() {
                    return location.href = i((null != this.returnPage ? "&returnPage=" + this.returnPage : "") + (null != this.locale ? "&locale=" + this.locale : "") + (null != this.brand ? "&brand=" + this.brand : "") + (null != this.installType ? "&type=" + this.installType : "")), !1;
                },
                compareVersions: function(e, t) {
                    for (var n = e.split("."), i = t.split("."), r = 0; r < n.length; ++r) {
                        n[r] = Number(n[r]);
                    }
                    for (var r = 0; r < i.length; ++r) {
                        i[r] = Number(i[r]);
                    }
                    return 2 == n.length && (n[2] = 0), n[0] > i[0] ? !0 : n[0] < i[0] ? !1 : n[1] > i[1] ? !0 : n[1] < i[1] ? !1 : n[2] > i[2] ? !0 : n[2] < i[2] ? !1 : !0;
                },
                enableAlerts: function() {
                    this.browserName = null, this.debug = !0;
                },
                poll: function() {
                    this.refresh();
                    var e = this.getJREs();
                    0 == this.preInstallJREList.length && 0 != e.length && (clearInterval(this.myInterval), null != this.returnPage && (location.href = this.returnPage)), 0 != this.preInstallJREList.length && 0 != e.length && this.preInstallJREList[0] != e[0] && (clearInterval(this.myInterval), null != this.returnPage && (location.href = this.returnPage));
                },
                writePluginTag: function() {
                    var e = this.getBrowser();
                    if ("MSIE" == e) {
                        var t = {
                            name: "object",
                            attributes: {
                                id: "deployJavaPlugin",
                                classid: "clsid:CAFEEFAC-DEC7-0000-0001-ABCDEFFEDCBA",
                                width: "0",
                                height: "0"
                            }
                        };
                        modelsToAppendToBodyFromDeployJava.push(t);
                    } else {
                        "Netscape Family" == e && this.allowPlugin() && this.writeEmbedTag();
                    }
                },
                refresh: function() {
                    navigator.plugins.refresh(!1);
                    var e = this.getBrowser();
                    if ("Netscape Family" == e && this.allowPlugin()) {
                        var t = document.getElementById("deployJavaPlugin");
                        null == t && this.writeEmbedTag();
                    }
                },
                writeEmbedTag: function() {
                    var e = !1;
                    if (null != navigator.mimeTypes) {
                        for (var t = 0; t < navigator.mimeTypes.length; t++) {
                            if (navigator.mimeTypes[t].type == this.mimeType && navigator.mimeTypes[t].enabledPlugin) {
                                var n = {
                                    name: "embed",
                                    attributes: {
                                        id: "deployJavaPlugin",
                                        type: this.mimeType,
                                        hidden: "true"
                                    }
                                };
                                modelsToAppendToBodyFromDeployJava.push(n), e = !0;
                            }
                        }
                        if (!e) {
                            for (var t = 0; t < navigator.mimeTypes.length; t++) {
                                if (navigator.mimeTypes[t].type == this.oldMimeType && navigator.mimeTypes[t].enabledPlugin) {
                                    ({
                                        name: "embed",
                                        attributes: {
                                            id: "deployJavaPlugin",
                                            type: this.oldMimeType,
                                            hidden: "true"
                                        }
                                    });
                                    modelsToAppendToBodyFromDeployJava.push(this.oldMimeType);
                                }
                            }
                        }
                    }
                }
            };
        if (h.writePluginTag(), null == h.locale) {
            var c = null;
            if (null == c) {
                try {
                    c = navigator.userLanguage;
                } catch (g) {}
            }
            if (null == c) {
                try {
                    c = navigator.systemLanguage;
                } catch (g) {}
            }
            if (null == c) {
                try {
                    c = navigator.language;
                } catch (g) {}
            }
            null != c && (c.replace("-", "_"), h.locale = c);
        }
        return h;
    })();
    window.EXT_LIB_DEF_FUNC_BOWSER = function() {
        function t(t) {
            function n(e) {
                var n = t.match(e);
                return n && n.length > 1 && n[1] || "";
            }
            function r(e) {
                var n = t.match(e);
                return n && n.length > 1 && n[2] || "";
            }
            function N(e) {
                switch (e) {
                    case "NT":
                        return "NT";
                    case "XP":
                        return "XP";
                    case "NT 5.0":
                        return "2000";
                    case "NT 5.1":
                        return "XP";
                    case "NT 5.2":
                        return "2003";
                    case "NT 6.0":
                        return "Vista";
                    case "NT 6.1":
                        return "7";
                    case "NT 6.2":
                        return "8";
                    case "NT 6.3":
                        return "8.1";
                    case "NT 10.0":
                        return "10";
                    default:
                        return undefined;
                }
            }
            var i = n(/(ipod|iphone|ipad)/i).toLowerCase(),
                s = /like android/i.test(t),
                o = !s && /android/i.test(t),
                u = /nexus\s*[0-6]\s*/i.test(t),
                a = !u && /nexus\s*[0-9]+/i.test(t),
                f = /CrOS/.test(t),
                l = /silk/i.test(t),
                c = /sailfish/i.test(t),
                h = /tizen/i.test(t),
                p = /(web|hpw)os/i.test(t),
                d = /windows phone/i.test(t),
                v = /SamsungBrowser/i.test(t),
                m = !d && /windows/i.test(t),
                g = !i && !l && /macintosh/i.test(t),
                y = !o && !c && !h && !p && /linux/i.test(t),
                b = n(/edge\/(\d+(\.\d+)?)/i),
                w = n(/version\/(\d+(\.\d+)?)/i),
                E = /tablet/i.test(t) && !/tablet pc/i.test(t),
                S = !E && /[^-]mobi/i.test(t),
                x = /xbox/i.test(t),
                T;
            /opera/i.test(t) ? T = {
                name: "Opera",
                opera: e,
                version: w || n(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
            } : /opr\/|opios/i.test(t) ? T = {
                name: "Opera",
                opera: e,
                version: n(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i) || w
            } : /SamsungBrowser/i.test(t) ? T = {
                name: "Samsung Internet for Android",
                samsungBrowser: e,
                version: w || n(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)
            } : /coast/i.test(t) ? T = {
                name: "Opera Coast",
                coast: e,
                version: w || n(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
            } : /yabrowser/i.test(t) ? T = {
                name: "Yandex Browser",
                yandexbrowser: e,
                version: w || n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
            } : /ucbrowser/i.test(t) ? T = {
                name: "UC Browser",
                ucbrowser: e,
                version: n(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
            } : /mxios/i.test(t) ? T = {
                name: "Maxthon",
                maxthon: e,
                version: n(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
            } : /epiphany/i.test(t) ? T = {
                name: "Epiphany",
                epiphany: e,
                version: n(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
            } : /puffin/i.test(t) ? T = {
                name: "Puffin",
                puffin: e,
                version: n(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
            } : /sleipnir/i.test(t) ? T = {
                name: "Sleipnir",
                sleipnir: e,
                version: n(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
            } : /k-meleon/i.test(t) ? T = {
                name: "K-Meleon",
                kMeleon: e,
                version: n(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
            } : d ? (T = {
                name: "Windows Phone",
                osname: "Windows Phone",
                windowsphone: e
            }, b ? (T.msedge = e, T.version = b) : (T.msie = e, T.version = n(/iemobile\/(\d+(\.\d+)?)/i))) : /msie|trident/i.test(t) ? T = {
                name: "Internet Explorer",
                msie: e,
                version: n(/(?:msie |rv:)(\d+(\.\d+)?)/i)
            } : f ? T = {
                name: "Chrome",
                osname: "Chrome OS",
                chromeos: e,
                chromeBook: e,
                chrome: e,
                version: n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
            } : /chrome.+? edge/i.test(t) ? T = {
                name: "Microsoft Edge",
                msedge: e,
                version: b
            } : /vivaldi/i.test(t) ? T = {
                name: "Vivaldi",
                vivaldi: e,
                version: n(/vivaldi\/(\d+(\.\d+)?)/i) || w
            } : c ? T = {
                name: "Sailfish",
                osname: "Sailfish OS",
                sailfish: e,
                version: n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
            } : /seamonkey\//i.test(t) ? T = {
                name: "SeaMonkey",
                seamonkey: e,
                version: n(/seamonkey\/(\d+(\.\d+)?)/i)
            } : /firefox|iceweasel|fxios/i.test(t) ? (T = {
                name: "Firefox",
                firefox: e,
                version: n(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
            }, /\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t) && (T.firefoxos = e, T.osname = "Firefox OS")) : l ? T = {
                name: "Amazon Silk",
                silk: e,
                version: n(/silk\/(\d+(\.\d+)?)/i)
            } : /phantom/i.test(t) ? T = {
                name: "PhantomJS",
                phantom: e,
                version: n(/phantomjs\/(\d+(\.\d+)?)/i)
            } : /slimerjs/i.test(t) ? T = {
                name: "SlimerJS",
                slimer: e,
                version: n(/slimerjs\/(\d+(\.\d+)?)/i)
            } : /blackberry|\bbb\d+/i.test(t) || /rim\stablet/i.test(t) ? T = {
                name: "BlackBerry",
                osname: "BlackBerry OS",
                blackberry: e,
                version: w || n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
            } : p ? (T = {
                name: "WebOS",
                osname: "WebOS",
                webos: e,
                version: w || n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
            }, /touchpad\//i.test(t) && (T.touchpad = e)) : /bada/i.test(t) ? T = {
                name: "Bada",
                osname: "Bada",
                bada: e,
                version: n(/dolfin\/(\d+(\.\d+)?)/i)
            } : h ? T = {
                name: "Tizen",
                osname: "Tizen",
                tizen: e,
                version: n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || w
            } : /qupzilla/i.test(t) ? T = {
                name: "QupZilla",
                qupzilla: e,
                version: n(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || w
            } : /chromium/i.test(t) ? T = {
                name: "Chromium",
                chromium: e,
                version: n(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || w
            } : /chrome|crios|crmo/i.test(t) ? T = {
                name: "Chrome",
                chrome: e,
                version: n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
            } : o ? T = {
                name: "Android",
                version: w
            } : /safari|applewebkit/i.test(t) ? (T = {
                name: "Safari",
                safari: e
            }, w && (T.version = w)) : i ? (T = {
                name: i == "iphone" ? "iPhone" : i == "ipad" ? "iPad" : "iPod"
            }, w && (T.version = w)) : /googlebot/i.test(t) ? T = {
                name: "Googlebot",
                googlebot: e,
                version: n(/googlebot\/(\d+(\.\d+))/i) || w
            } : T = {
                name: n(/^(.*)\/(.*) /),
                version: r(/^(.*)\/(.*) /)
            }, !T.msedge && /(apple)?webkit/i.test(t) ? (/(apple)?webkit\/537\.36/i.test(t) ? (T.name = T.name || "Blink", T.blink = e) : (T.name = T.name || "Webkit", T.webkit = e), !T.version && w && (T.version = w)) : !T.opera && /gecko\//i.test(t) && (T.name = T.name || "Gecko", T.gecko = e, T.version = T.version || n(/gecko\/(\d+(\.\d+)?)/i)), !T.windowsphone && !T.msedge && (o || T.silk) ? (T.android = e, T.osname = "Android") : !T.windowsphone && !T.msedge && i ? (T[i] = e, T.ios = e, T.osname = "iOS") : g ? (T.mac = e, T.osname = "macOS") : x ? (T.xbox = e, T.osname = "Xbox") : m ? (T.windows = e, T.osname = "Windows") : y && (T.linux = e, T.osname = "Linux");
            var C = "";
            T.windows ? C = N(n(/Windows ((NT|XP)( \d\d?.\d)?)/i)) : T.windowsphone ? C = n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i) : T.mac ? (C = n(/Mac OS X (\d+([_\.\s]\d+)*)/i), C = C.replace(/[_\s]/g, ".")) : i ? (C = n(/os (\d+([_\s]\d+)*) like mac os x/i), C = C.replace(/[_\s]/g, ".")) : o ? C = n(/android[ \/-](\d+(\.\d+)*)/i) : T.webos ? C = n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i) : T.blackberry ? C = n(/rim\stablet\sos\s(\d+(\.\d+)*)/i) : T.bada ? C = n(/bada\/(\d+(\.\d+)*)/i) : T.tizen && (C = n(/tizen[\/\s](\d+(\.\d+)*)/i)), C && (T.osversion = C);
            var k = !T.windows && C.split(".")[0];
            if (E || a || i == "ipad" || o && (k == 3 || k >= 4 && !S) || T.silk) {
                T.tablet = e;
            } else {
                if (S || i == "iphone" || i == "ipod" || o || u || T.blackberry || T.webos || T.bada) {
                    T.mobile = e;
                }
            }
            return T.msedge || T.msie && T.version >= 10 || T.yandexbrowser && T.version >= 15 || T.vivaldi && T.version >= 1 || T.chrome && T.version >= 20 || T.samsungBrowser && T.version >= 4 || T.firefox && T.version >= 20 || T.safari && T.version >= 6 || T.opera && T.version >= 10 || T.ios && T.osversion && T.osversion.split(".")[0] >= 6 || T.blackberry && T.version >= 10.1 || T.chromium && T.version >= 20 ? T.a = e : T.msie && T.version < 10 || T.chrome && T.version < 20 || T.firefox && T.version < 20 || T.safari && T.version < 6 || T.opera && T.version < 10 || T.ios && T.osversion && T.osversion.split(".")[0] < 6 || T.chromium && T.version < 20 ? T.c = e : T.x = e, T;
        }
        function r(e) {
            return e.split(".").length;
        }
        function i(e, t) {
            var n = [],
                r;
            if (Array.prototype.map) {
                return Array.prototype.map.call(e, t);
            }
            for (r = 0; r < e.length; r++) {
                n.push(t(e[r]));
            }
            return n;
        }
        function s(e) {
            var t = Math.max(r(e[0]), r(e[1])),
                n = i(e, function(e) {
                    var n = t - r(e);
                    return e += (new Array(n + 1)).join(".0"), i(e.split("."), function(e) {
                        return (new Array(20 - e.length)).join("0") + e;
                    }).reverse();
                });
            while (--t >= 0) {
                if (n[0][t] > n[1][t]) {
                    return 1;
                }
                if (n[0][t] !== n[1][t]) {
                    return -1;
                }
                if (t === 0) {
                    return 0;
                }
            }
        }
        function o(e, r, i) {
            var o = n;
            typeof r == "string" && (i = r, r = void 0), r === void 0 && (r = !1), i && (o = t(i));
            var u = "" + o.version;
            for (var a in e) {
                if (e.hasOwnProperty(a) && o[a]) {
                    if (typeof e[a] != "string") {
                        throw new Error("Browser version in the minVersion map should be a string: " + a + ": " + String(e));
                    }
                    return s([u, e[a]]) < 0;
                }
            }
            return r;
        }
        function u(e, t, n) {
            return !o(e, t, n);
        }
        var e = !0,
            n = t(typeof navigator != "undefined" ? navigator.userAgent || "" : "");
        return n.test = function(e) {
            for (var t = 0; t < e.length; ++t) {
                var r = e[t];
                if (typeof r == "string" && r in n) {
                    return !0;
                }
            }
            return !1;
        }, n.isUnsupportedBrowser = o, n.compareVersions = s, n.check = u, n._detect = t, n;
    };
    var g, k, l = (new Date).getTime() + "-" + Math.floor(1001 * Math.random() + 0);

    function m(a, b, c, d, f) {
        this.mimeType = a;
        this.b = b;
        this.src = c;
        this.m = d;
        this.a = f
    }
    g = m.prototype;
    g.u = function() {
        return this.m
    };
    g.v = function() {
        return this.mimeType
    };
    g.w = function() {
        return this.b
    };
    g.s = function() {
        return this.a
    };
    g.h = function() {
        return "object" === typeof this.a ? this.a.ImageWidth : void 0
    };
    g.f = function() {
        return "object" === typeof this.a ? this.a.ImageLength : void 0
    };
    g.c = function() {
        return "object" === typeof this.a ? this.a.BitsPerPixel : void 0
    };
    g.j = function() {
        return "object" === typeof this.a ? 2 == this.a.PixelType : void 0
    };
    g.l = function() {
        return "object" === typeof this.a ? 1 == this.a.PixelType : void 0
    };
    g.i = function() {
        return "object" === typeof this.a ? 0 == this.a.PixelType : void 0
    };
    g.g = function() {
        return "object" === typeof this.a ? Math.floor(this.a.XResolution) : void 0
    };
    g.o = function() {
        if (this.b) return this.b ? aa(this.src) : void 0
    };
    g.toString = function() {
        var a = "";
        this.j() ? a += "Color " : this.l() ? a += "Gray " : this.i() && (a += "Black/white ");
        a += "image:";
        var b = this.h(),
            c = this.f(),
            d = this.c(),
            f = this.g();
        0 < b && 0 < c && (a += " " + b + " x " + c);
        0 < d && (a += " " + d + "-bit");
        0 < f && (a += " @ " + f + " DPI");
        return a
    };

    function p(a, b) {
        var c = "scannerjs_" + a;
        c = window && c in window ? window[c] : void 0;
        !c && window && "scannerjs_config" in window && (c = a in window.scannerjs_config ? window.scannerjs_config[a] : void 0);
        return void 0 == c || null == c ? b : c
    }
    var ba, q, r, t, u, v, w, ca, x, da, y, B, C, D, E, F, G, ea, fa, H, ia, I, ja, ka, J, la, K, ma, L, M;
    ba = p("log_level", 0);
    q = p("java_applet_enabled", !1);
    r = !1;
    t = p("scan_app_enabled", !0);
    u = p("scan_app_download_url", "http://asprise.azureedge.net/scanapp/scan-setup.exe");
    v = p("scan_app_min_version", "2.04");
    w = p("license", "com_asprise_scan_app_license" in window ? window.com_asprise_scan_app_license : null);
    ca = p("skip_load_default_css", !1);
    x = p("scan_app_port_range_lowest", 9713);
    da = p("scan_app_port_range_highest", 9716);
    D = C = B = y = void 0;
    E = [];
    G = F = void 0;
    ea = p("form_field_name_for_img_objects", "com_asprise_scannerjs_images[]");
    fa = p("form_field_name_for_img_urls", "com_asprise_scannerjs_images_urls[]");
    H = !1;
    ia = p("eager_init", !0);
    I = null;
    ja = p("display_install_func", void 0);
    ka = p("display_scan_ready_func", void 0);
    J = p("event_listener", void 0);
    la = p("sys_response_callback_func", void 0);
    K = !1;
    ma = p("additional_css_classes_for_dialogs", "");
    L = p("file_name_base", "scanner");
    M = function() {
        if (!H) {
            I = new Date;
            J && J("pre-init");
            p("skip_fix_formdata_append", !1) || na();
            N("Initializing Scanner.js v2.11.0 \u00a9 Asprise ...");
            ca || oa();
            if (q && O()) {
                var a = window.location.href;
                a && 0 > a.toLowerCase().indexOf("http:") && 0 > a.toLowerCase().indexOf("https:") && (N("The scan applet does *NOT* work in local HTML files. Please host this page on localhost or any other servers and access it using http:// or https://.", !0), alert("The scan applet does *NOT* work in local HTML files. Please host this page on localhost or any other servers and access it using http:// or https://."));
                N("Attempt to enable Java applet for scanning ...");
                N(P.name + " " + P.version + " supports NPAPI? " + O());
                pa();
                try {
                    qa()
                } catch (b) {
                    N("Failed to add applet element: " + b, !0)
                }
                t && Q() && (!ra() || P.firefox ? window.setTimeout(function() {
                    K || (N("Java applet doesn't seem running. Falling back to scan app ..."), R())
                }, 1E3) : N("JRE: " + ta.getJREs()))
            } else q && !O() && N("The scanning Java applet is set to on, but this browser doesn't support NPAPI: " + P.name + " " + P.version, !0), R();
            N("Scanner.js initialized.");
            H = !0;
            J && J("post-init")
        }
    };
    var S = null;

    function U(a, b, c, d, f, e, h, n, z, T) {
        V() || r || "scan" != b && "listSources" != b && "getSource" != b && "getSystemInfo" != b || (S = arguments);
        if (!V() && !r) return q && O() ? null != I && 1E4 < (new Date).getTime() - I.getTime() && ua(!0) : ua(!0), !1;
        if (2 > arguments.length) return W("Invalid function call - func name is not specified"), !1;
        if ("function" !== typeof a) return W("asprise_scanner_js_call_function requires a valid callbackFunc"), !1;
        if ("PENDING" == D || "PROCESSING" == D) return W("You can not submit a new request as the previous request has not completed yet."), !1;
        if (!JSON || "function" !== typeof JSON.stringify) return W("JSON.stringify is not supported by your browser."), !1;
        for (var A = {
            funcCallId: "" + (new Date).getTime() + "-" + Math.floor(1E4 * Math.random()),
            funcName: b,
            time: (new Date).getTime(),
            userAgent: navigator.userAgent,
            isModernBrowser: Q(),
            windowTitle: document.title,
            url: window.location.href,
            pageLoadId: va()
        }, sa = [], ha = 2; ha < arguments.length; ha++) sa.push(arguments[ha]);
        A.funcArgs = sa;
        A = JSON.stringify(A);
        D = "PENDING";
        F = A;
        G = a;
        J && J("func-call", A);
        wa();
        return !0
    }
    function wa() {
        if (V() && "PENDING" == D) try {
            B.send(F), D = "PROCESSING"
        } catch (a) {
            X(!1, "Failed: " + a, null, null, null, null, null), N(a, !0)
        }
    }
    function xa(a) {
        var b = null;
        if ("string" === typeof a && 6 < a.length && "<error" == a.substr(0, 6)) throw a;
        if (a && 7 < a.length && "SYSTEM/" == a.substr(0, 7)) try {
            var c = a.indexOf(":");
            if (0 < c && "NET" == a.substr(7, 3)) {
                var d = a.substr(0, c);
                ya(a.substr(c + 1).trim().split("|"), function(a, b) {
                    try {
                        B.send(d + ":" + JSON.stringify({
                                success: a,
                                data: b
                            }))
                    } catch (h) {
                        N("Failed to send command: " + h, !0)
                    }
                })
            } else la && (0 < c ? la(a.substr(0, c), a.substr(c + 1)) : W("Invalid system response: " + a))
        } catch (f) {
            N("Error while processing system request: " + f, !0)
        } else {
            try {
                b = JSON.parse(a)
            } catch (f) {
                W("Failed to parse JSON: " + a);
                X(!1, "Failed to parse JSON: " + a, null, null, null, null, null);
                return
            }
            b instanceof Array ? X(b[0], b[1], b[2], b[3], b[4], 5 < b.length ? b[5] : null, 6 < b.length ? b[6] : null) : X(!1, "JSON returned from WebSocket is not array", null, null, null, null, null)
        }
    }
    function X(a, b, c, d, f, e, h) {
        null != f && 1 != f && W("resultCount should be null or 1, actual: " + f);
        if (h) for (c = 0; c < E.length; c++) if (d = E[c], null != d && d.funcCallId == h) {
            N("Response is ignored for cancelled func call: " + d.funcName + ", call id: " + d.funcCallId + ":\n" + e);
            return
        }
        D = "COMPLETE";
        G(a, b, e);
        if (J) try {
            J("func-return")
        } catch (n) {
            N("Exception occurred in event handler: " + n, !0)
        }
        try {
            window.focus()
        } catch (n) {}
    }
    function za(a) {
        xa(a.data)
    }
    function V() {
        return void 0 != B
    }
    function Aa(a) {
        K = !0;
        if ("PENDING" == D || "PROCESSING" == D) {
            var b = JSON.parse(F);
            E.push(b);
            N("Canceled func call: " + b.funcName + ", call id: " + b.funcCallId);
            J && J("func-cancelled", b)
        }
        D = void 0;
        ua(!1);
        "function" == typeof ka && ka();
        J && J("ready", a);
        S && 2 <= S.length && U.apply(null, Array.prototype.slice.call(S))
    }
    function Ba(a) {
        B = a;
        N("Scan WebSocket server connected: " + B.url);
        w && a.send("LICENSE: " + w);
        v && a.send("MIN_VERSION: " + v);
        Aa(!0);
        wa()
    }
    function Ca() {
        B = void 0;
        R(!0)
    }
    function R(a) {
        if (t) if (B) C = void 0, B.close();
        else {
            a || (y = void 0);
            var b = null != window.location.href && "http:" == window.location.href.substr(0, 5) ? "ws://127.0.0.1" : "wss://local.scannerjs.com";
            a = 3 < b.length && "wss" == b.substr(0, 3).toLowerCase();
            void 0 == y ? y = x : void 0 != C && 1E4 > (new Date).getTime() - C && (y += 1);
            y % 2 != (a ? 0 : 1) && (y += 1);
            if (y < x || y > da) N("Failed to connect to WebSocket server.", !0), J && J("failed-to-connect"), O(), R();
            else {
                C = (new Date).getTime();
                a = Da;
                b = b + ":" + y + "/" + va() + "/";
                var c = window.location.href;
                if (null != c) {
                    var d = c.indexOf("#");
                    c = 0 <= d ? c.substr(0, d) : c
                }
                a(b + encodeURIComponent(c))
            }
        } else W("Scan app implementation is disabled explicitly.")
    }
    function Ea() {
        for (var a = document.getElementsByTagName("script"), b = 0; b < a.length; b++) {
            var c = a.item(b),
                d = new RegExp(L + "\\.js(\\?\\w*)?$");
            if (c.src && c.src.match(d)) return a = c.src, a.substring(0, a.lastIndexOf("/") + 1)
        }
        return "https://asprise.azureedge.net/scannerjs/"
    }
    function qa() {
        var a;
        (a = Ea()) || (a = "https://asprise.azureedge.net/scannerjs/"); - 1 < a.indexOf("FORCE_REFRESH") && -1 < window.location.href.indexOf("FORCE_REFRESH") && (a = a.replace(/FORCE_REFRESH/g, "FORCE_REFRESH_" + (new Date).getTime()));
        var b = document.getElementById("com_asprise_scan_applet");
        null == b && (b = ta.versionCheck("1.7.0_45+") ? "asprise_scan.jar" : "asprise_scan-legacy.jar", b = Y({
            name: "applet",
            attributes: {
                id: "com_asprise_scan_applet",
                codebase: a,
                archive: b,
                code: "com.asprise.imaging.scan.ui.web.ScanApplet",
                width: 1,
                height: 1,
                style: "z-index: -999;"
            },
            children: [{
                name: "param",
                attributes: {
                    name: "permissions",
                    value: "all-permissions"
                }
            }, {
                name: "param",
                attributes: {
                    name: "java_version",
                    value: "1.6+"
                }
            }, {
                name: "param",
                attributes: {
                    name: "java_arguments",
                    value: "-Xmx512m"
                }
            }, {
                name: "param",
                attributes: {
                    name: "separate_jvm",
                    value: "true"
                }
            }, {
                name: "param",
                attributes: {
                    name: "codebase_lookup",
                    value: "false"
                }
            }, {
                name: "param",
                attributes: {
                    name: "mayscript",
                    value: "mayscript"
                }
            }]
        }), a = document.getElementsByTagName("body"), a = null != a && 0 < a.length ? a.item(0) : null, null == a ? W('please do not execute com_asprise_scan_addScanAppletToDomIfNotExists in <header>. document.getElementsByTagName("body").length = ' + document.getElementsByTagName("body").length) : a.appendChild(b))
    }
    function ua(a) {
        if ("function" != typeof ja || ja(a)) H ? Fa(a) : (M(), a || Fa(a))
    }
    function Fa(a) {
        var b = document.getElementById("asprise-web-scan-setup-dialog-wrapper");
        if (a || b) {
            if (!b) {
                b = {
                    name: "div",
                    attributes: {
                        id: "asprise-web-scan-setup-dialog-wrapper",
                        "class": "asprise-web-scan-dialog-wrapper " + ma
                    },
                    children: [{
                        name: "div",
                        attributes: {
                            id: "asprise-web-scan-setup-dialog-overlay",
                            "class": "overlay asprise-web-scan-dialog-display",
                            style: "display: none"
                        }
                    }, {
                        name: "div",
                        attributes: {
                            id: "asprise-web-scan-setup-dialog",
                            "class": "asprise-web-scan-dialog asprise-web-scan-dialog-display",
                            style: "display: none"
                        },
                        children: [{
                            name: "button",
                            attributes: {
                                "class": "top-right-closer",
                                title: "Dismiss this dialog"
                            }
                        }, {
                            name: "div",
                            attributes: {
                                "class": "asprise-web-scan-setup",
                                style: "margin: auto"
                            },
                            children: [{
                                name: "h2",
                                attributes: {
                                    text: "Please complete one-time setup"
                                }
                            }, {
                                name: "table",
                                attributes: {
                                    "class": "asprise-web-scan-setup-instruction"
                                },
                                children: [{
                                    name: "tr",
                                    attributes: {
                                        "class": "icon"
                                    },
                                    children: [{
                                        name: "td",
                                        attributes: {
                                            width: "33%",
                                            "class": "download"
                                        }
                                    }, {
                                        name: "td",
                                        attributes: {
                                            width: "33%",
                                            "class": "run"
                                        }
                                    }, {
                                        name: "td",
                                        attributes: {
                                            width: "33%",
                                            "class": "enjoy"
                                        }
                                    }]
                                }, {
                                    name: "tr",
                                    attributes: {
                                        "class": "after_icon"
                                    },
                                    children: [{
                                        name: "td",
                                        attributes: {
                                            colspan: "3"
                                        }
                                    }]
                                }, {
                                    name: "tr",
                                    attributes: {
                                        "class": "text"
                                    },
                                    children: [{
                                        name: "td",
                                        attributes: {
                                            "class": "download"
                                        },
                                        children: [{
                                            name: "h3",
                                            children: [{
                                                name: "a",
                                                attributes: {
                                                    href: u,
                                                    target: "_blank",
                                                    text: "Download"
                                                }
                                            }]
                                        }, {
                                            name: "p",
                                            children: [{
                                                name: "a",
                                                attributes: {
                                                    "class": "underline",
                                                    href: u,
                                                    target: "_blank",
                                                    title: "One time setup executable",
                                                    text: "Download the setup"
                                                }
                                            }, {
                                                name: "span",
                                                attributes: {
                                                    text: ";"
                                                }
                                            }, {
                                                name: "br"
                                            }, {
                                                name: "span",
                                                attributes: {
                                                    style: "font-size: smaller",
                                                    text: "Other formats: "
                                                }
                                            }, {
                                                name: "a",
                                                attributes: {
                                                    style: "font-size: smaller",
                                                    "class": "underline",
                                                    href: u.substr(0, u.lastIndexOf(".")) + ".zip",
                                                    target: "_blank",
                                                    title: "Zip format",
                                                    text: "zip"
                                                }
                                            }, {
                                                name: "span",
                                                attributes: {
                                                    style: "font-size: smaller",
                                                    text: " \u00b7 "
                                                }
                                            }, {
                                                name: "a",
                                                attributes: {
                                                    style: "font-size: smaller",
                                                    "class": "underline",
                                                    href: u.substr(0, u.lastIndexOf(".")) + ".7z",
                                                    target: "_blank",
                                                    title: "7Z format",
                                                    text: "7z"
                                                }
                                            }]
                                        }]
                                    }, {
                                        name: "td",
                                        attributes: {
                                            "class": "run"
                                        },
                                        children: [{
                                            name: "h3",
                                            attributes: {
                                                text: "Run"
                                            }
                                        }, {
                                            name: "p",
                                            attributes: {
                                                text: "Run the setup, follow the instruction;"
                                            }
                                        }]
                                    }, {
                                        name: "td",
                                        attributes: {
                                            "class": "enjoy"
                                        },
                                        children: [{
                                            name: "h3",
                                            attributes: {
                                                text: "Scan"
                                            }
                                        }, {
                                            name: "p",
                                            attributes: {
                                                text: "Viola you're ready to scan!"
                                            }
                                        }]
                                    }]
                                }]
                            }, {
                                name: "p",
                                children: [{
                                    name: "span",
                                    attributes: {
                                        text: "Already have the scan app set up? "
                                    }
                                }, {
                                    name: "a",
                                    attributes: {
                                        "class": "underline",
                                        href: "AspriseWebScan://browser",
                                        target: "_top",
                                        text: "Click here to enable it."
                                    }
                                }]
                            }]
                        }]
                    }, {
                        name: "div",
                        attributes: {
                            id: "asprise-web-scan-setup-ok-dialog",
                            "class": "asprise-web-scan-dialog small-dialog asprise-web-scan-setup-ok-dialog",
                            style: "display: none"
                        },
                        children: [{
                            name: "button",
                            attributes: {
                                "class": "top-right-closer",
                                title: "Dismiss this dialog"
                            }
                        }, {
                            name: "div",
                            attributes: {
                                "class": "asprise-web-scan-setup-ok"
                            },
                            children: [{
                                name: "div",
                                attributes: {
                                    "class": "icon"
                                }
                            }, {
                                name: "div",
                                children: [{
                                    name: "p",
                                    attributes: {
                                        text: "All set. You may scan now."
                                    }
                                }]
                            }]
                        }]
                    }]
                };
                var c = document.getElementsByTagName("body");
                c = null != c && 0 < c.length ? c.item(0) : null;
                if (null == c) {
                    W("please do not execute displaySetupDialog in <header>!");
                    return
                }
                c.appendChild(Y(b));
                if (b = document.getElementById("asprise-web-scan-setup-dialog-wrapper")) {
                    c = b.getElementsByClassName("top-right-closer");
                    for (var d = 0; c && d < c.length; ++d) c[d].addEventListener("click", function() {
                        this.parentElement.previousElementSibling.style.display = "none";
                        this.parentElement.style.display = "none"
                    })
                }
            }
            a ? Z(b, ".asprise-web-scan-dialog-display", "display", "block") : (V() ? (Z(b, ".asprise-web-scan-setup-ok-dialog", "display", "block"), Z(b, ".asprise-web-scan-setup-ok-dialog", "opacity", "1"), Ga(b.querySelectorAll(".asprise-web-scan-setup-ok-dialog"), 2500)) : Z(b, ".asprise-web-scan-setup-ok-dialog", "display", "none"), Z(b, ".asprise-web-scan-dialog-display", "display", "none"))
        }
    }
    function Z(a, b, c, d) {
        a = a.querySelectorAll(b);
        for (b = 0; a && b < a.length; b++) a[b].style[c] = d
    }
    function Ga(a, b) {
        if (null != a && 0 != a.length) if (0 < b) setTimeout(function() {
            Ga(a)
        }, b);
        else var c = 1,
                d = setInterval(function() {
                    if (0 >= c) {
                        clearInterval(d);
                        for (var b = 0; b < a.length; b++) a.item(b).style.display = "none"
                    } else {
                        for (b = 0; b < a.length; b++) a.item(b).style.opacity = c.toFixed(1);
                        c -= .1
                    }
                }, 50)
    }
    function oa() {
        for (var a = !1, b = document.getElementsByTagName("link"), c = 0; c < b.length; c++) {
            var d = b.item(c),
                f = new RegExp(L + "\\.css(\\?\\w*)?$");
            d.href && d.href.match(f) && (a = !0)
        }
        a || (a = Ea() + L + ".css", b = document.createElement("link"), b.setAttribute("rel", "stylesheet"), b.setAttribute("type", "text/css"), b.setAttribute("href", a), document.getElementsByTagName("head")[0].appendChild(b))
    }
    function ya(a, b) {
        if (!Array.isArray(a)) throw "Expecting an Array, actual: " + a;
        if (0 == a.length) b(!1, null);
        else {
            var c = a[0];
            a.splice(0, 1);
            var d = new XMLHttpRequest;
            d.open("GET", c, !0);
            d.onreadystatechange = function() {
                d.readyState === XMLHttpRequest.DONE && (200 <= d.status && 300 > d.status ? b(!0, d.responseText) : (N("Failed to " + c + ": " + d.statusText, !0), ya(a, b)))
            };
            d.send()
        }
    }
    function Da(a) {
        if ("WebSocket" in window) var b = new WebSocket(a);
        else if ("MozWebSocket" in window) b = new MozWebSocket(a);
        else return;
        "function" === typeof Ba ? b.onopen = function() {
            Ba(b)
        } : (N("No onOpenFunc specified for " + a), b.onopen = function() {
            N("WebSocket [" + b.url + "] opens.")
        });
        "function" === typeof Ca ? b.onclose = function() {
            Ca()
        } : (N("No onCloseFunc specified for " + a), b.onclose = function(a) {
            N("WebSocket [" + b.url + "] closes: " + a.code + " / " + a.reason + " / clean? " + a.A)
        });
        "function" === typeof za ? (b.onmessage = function(a) {
            za(a)
        }, b.onerror = function(a) {
            N("WebSocket [" + b.url + "] error occurs:" + JSON.stringify(a))
        }, J && J("disconnected", !0)) : W("You must specify onMesgFunc for " + a)
    }
    function Q() {
        return "function" === typeof atob && "function" === typeof ArrayBuffer && "function" === typeof Uint8Array && "function" === typeof Blob && "function" === typeof FormData
    }
    function aa(a, b) {
        if (!Q()) return W("base64ToBlob() is not supported in legacy browsers."), null;
        if (null != a && 0 == a.indexOf("data:")) {
            var c = a.indexOf(";");
            !b && 0 < c && (b = a.substring(5, c));
            c = a.indexOf("base64,");
            0 < c && (a = a.substr(c + 7))
        }
        a = a.replace(/(\r\n|\n|\r)/gm, "");
        a = atob(a);
        c = a.length;
        var d = new ArrayBuffer(c);
        d = new Uint8Array(d);
        for (var f = 0; f < c; f++) d[f] = a.charCodeAt(f);
        a = new Blob([d], {
            type: b
        });
        if (!e) {
            c = new Date;
            var e = [c.getFullYear(), c.getMonth() + 1, c.getDate(), c.getHours(), c.getMinutes(), c.getSeconds()];
            e = "" + (2E3 < e[0] ? e[0] - 2E3 : e[0]) + (10 > e[1] ? "0" : "") + e[1] + (10 > e[2] ? "0" : "") + e[2] + (10 > e[3] ? "0" : "") + e[3] + (10 > e[4] ? "0" : "") + e[4] + (10 > e[5] ? "0" : "") + e[5];
            c = c.getMilliseconds();
            d = 1;
            for (f = 0; 2 > f; f++) d *= 10;
            for (d = "" + (Math.floor(Math.random() * (d - 0 + 1)) + 0); 2 > d.length;) d = "0" + d;
            e = e + ((100 > c ? (10 > c ? "0" : "") + "0" : "") + c) + d;
            e = e + "." + (null == b ? "unknown" : 0 <= b.toLowerCase().indexOf("bmp") ? "bmp" : 0 <= b.toLowerCase().indexOf("png") ? "png" : 0 <= b.toLowerCase().indexOf("jp") ? "jpg" : 0 <= b.toLowerCase().indexOf("tif") ? "tif" : 0 <= b.toLowerCase().indexOf("pdf") ? "pdf" : "unknown")
        }
        if (e) try {
            a.lastModifiedDate = new Date, a.name = e
        } catch (h) {}
        return a
    }
    function va() {
        window.sessionStorage && (sessionStorage.getItem("pageLoadId") ? l = sessionStorage.getItem("pageLoadId") : sessionStorage.setItem("pageLoadId", l));
        return l
    }
    function ra() {
        var a = ta.getJREs();
        return void 0 == a || "" == a || a instanceof Array && 0 == a.length ? !1 : !0
    }
    function O() {
        if (!("version" in P)) return W("Invalid bowser"), !1;
        var a = Math.floor(P.version);
        return P.chrome ? 45 > a : P.firefox ? 53 > a : P.msedge ? !1 : P.msie ? !0 : !1
    }
    function Y(a) {
        var b = a.attributes,
            c = document.createElement(a.name);
        if (null != b) for (var d in b) c.setAttribute(d, b[d]);
        (b = null != b && "text" in b ? b.text : void 0) && c.appendChild(document.createTextNode(b));
        if (a.children instanceof Array) for (a = a.children, b = 0; b < a.length; b++) a[b] && c.appendChild(Y(a[b]));
        return c
    }
    function N(a, b) {
        if (!(ba > (b ? 16 : 4))) if (window.console) {
            var c = (new Date).toLocaleTimeString();
            b ? console.error ? console.error(c + " " + a) : console.log(c + " ERROR: " + a) : console.info ? console.info(c + " " + a) : console.log(c + " INFO: " + a)
        } else b && window.alert && alert("ERROR: " + a)
    }
    function W(a) {
        N(a, !0)
    }
    function na() {
        k || (k = window.FormData.prototype.append, window.FormData.prototype.append = function(a, b, c) {
            b instanceof Blob && null == c ? k.apply(this, [a, b, b.name]) : k.apply(this, arguments)
        })
    }
    var ta = deployJava;

    function pa() {
        if (0 != modelsToAppendToBodyFromDeployJava.length) {
            var a = document.getElementsByTagName("body");
            a = null != a && 0 < a.length ? a.item(0) : null;
            if (null == a) W("Unexcepted error - unable to get body");
            else for (var b = 0; b < modelsToAppendToBodyFromDeployJava.length; b++) a.appendChild(Y(modelsToAppendToBodyFromDeployJava[b]))
        }
    }
    var P = window.EXT_LIB_DEF_FUNC_BOWSER();
    delete window.EXT_LIB_DEF_FUNC_BOWSER;
    window.scannerjs = {};
    window.scannerjs.webSocketSend = function(a) {
        return B.send(a)
    };
    window.scannerjs.doesCurrentBrowserSupportNPAPI = O;
    window.scannerjs.onAppletStarted = function(a) {
        r = !0;
        N("Applet started: " + a);
        Aa(!1)
    };
    window.scannerjs.getRequestFuncCall = function() {
        return F
    };
    window.scannerjs.functionReturn = X;
    window.scannerjs.getRequestStatus = function() {
        return D
    };
    window.scannerjs.setRequestStatus = function(a) {
        return D = a
    };
    window.scannerjs.callFunction = U;
    window.scannerjs.scan = function(a, b, c, d) {
        if ("string" !== typeof b && (!JSON || "function" !== typeof JSON.stringify)) return W("JSON.stringify is not supported by your browser."), !1;
        var f = "string" === typeof b ? b : JSON.stringify(b);
        return U(a, "scan", f, 3 <= arguments.length ? c : null, 4 <= arguments.length ? d : null)
    };
    window.scannerjs.listSources = function(a, b, c, d, f, e) {
        return U(a, "listSources", 2 <= arguments.length ? b : !0, 3 <= arguments.length ? c : null, 4 <= arguments.length ? d : !1, 5 <= arguments.length ? f : !0, 6 <= arguments.length && null != e ? "string" === typeof e ? e : JSON.stringify(e) : "")
    };
    window.scannerjs.getSource = function(a, b, c, d, f, e, h, n) {
        return U(a, "getSource", 2 <= arguments.length ? b : "select", 3 <= arguments.length ? c : !0, 4 <= arguments.length ? d : null, 5 <= arguments.length ? f : !0, 6 <= arguments.length ? e : !1, 7 <= arguments.length ? h : null, 8 <= arguments.length && null != n ? "string" === typeof n ? n : JSON.stringify(n) : "")
    };
    window.scannerjs.getSystemInfo = function(a) {
        return U(a, "asprise_scan_system_info")
    };
    window.scannerjs.initialize = M;
    window.scannerjs.getScannedImages = function(a, b, c) {
        var d = [];
        2 > arguments.length && (b = !0);
        3 > arguments.length && (c = !1);
        if (!b && !c) return W("getImages: will return no image as neither includeOriginals nor includeThumbnails is true."), d;
        if ("string" === typeof a) {
            if (6 < a.length && "<error" == a.substr(0, 6)) throw a;
            try {
                a = JSON.parse(a)
            } catch (A) {
                throw a;
            }
        }
        if ("object" === typeof a && a.output instanceof Array) for (var f = a.output, e = 0; e < f.length; e++) {
            var h = f[e];
            if (b && "return-base64" == h.type || c && "return-base64-thumbnail" == h.type) {
                var n = h.format;
                n = null == n ? "application/octet-stream" : 0 <= n.toLowerCase().indexOf("bmp") ? "image/bmp" : 0 <= n.toLowerCase().indexOf("png") ? "image/png" : 0 <= n.toLowerCase().indexOf("jp") ? "image/jpeg" : 0 <= n.toLowerCase().indexOf("tif") ? "image/tiff" : 0 <= n.toLowerCase().indexOf("pdf") ? "application/pdf" : "application/octet-stream";
                if ("application/octet-stream" == n) N("Unable to find mime type for " + h.format);
                else if (h.result instanceof Array) for (var z = 0; z < h.result.length; z++) {
                    var T = a.images instanceof Array && z < a.images.length ? a.images[z] : null;
                    d.push(new m(n, !0, "data:" + n + ";base64," + h.result[z], T, T ? T.image_info : void 0, h.hasOwnProperty("selected_action") ? h.selected_action : void 0, h.hasOwnProperty("selected_filename") ? h.selected_filename : void 0))
                } else N("Output contains no result records", !0)
            }
        }
        return d
    };
    window.scannerjs.getUploadResponse = function(a) {
        if ("string" === typeof a) {
            if (6 < a.length && "<error" == a.substr(0, 6)) throw a;
            try {
                a = JSON.parse(a)
            } catch (d) {
                throw a;
            }
        }
        if ("object" === typeof a && a.output instanceof Array) {
            a = a.output;
            for (var b = 0; b < a.length; b++) {
                var c = a[b];
                if (("upload" == c.type || "upload-thumbnail" == c.type) && c.result instanceof Array && 0 < c.result.length) return c.result[0]
            }
        }
    };
    window.scannerjs.getSaveResponse = function(a) {
        if ("string" === typeof a) {
            if (6 < a.length && "<error" == a.substr(0, 6)) throw a;
            try {
                a = JSON.parse(a)
            } catch (d) {
                throw a;
            }
        }
        if ("object" === typeof a && a.output instanceof Array) {
            a = a.output;
            for (var b = 0; b < a.length; b++) {
                var c = a[b];
                if ("save" == c.type || "save-thumbnail" == c.type) return JSON.stringify(c.result)
            }
        }
    };
    window.scannerjs.createDomElementFromModel = Y;
    window.scannerjs.submitFormWithImages = function(a, b, c) {
        if (b instanceof Array && 0 != b.length) {
            for (var d = 0; d < b.length; d++) {
                var f = b[d];
                if (!(f instanceof m)) {
                    N("Invalid image object: " + f, !0);
                    W("Invalid image object!");
                    return
                }
            }
            var e = document.getElementById(a);
            if (null == e) W("Form doesn't exist: " + a);
            else {
                a = new FormData(e);
                for (d = 0; d < b.length; d++) f = b[d], f.b ? a.append(ea, aa(f.src, f.mimeType)) : a.append(fa, f.src);
                N("POST images, count: " + b.length);
                var h = new XMLHttpRequest;
                h.open("POST", e.getAttribute("action"), !0);
                h.onreadystatechange = function() {
                    "function" == typeof c && c(h)
                };
                h.send(a);
                N("Form posted: " + h);
                return h
            }
        } else W("no images - form submit cancelled.")
    };
    window.scannerjs.logToConsole = N;
    window.scannerjs.base64ToUint8Array = function(a) {
        if (!Q()) return W("base64ToBlob() is not supported in legacy browsers."), null;
        if (null != a && 0 == a.indexOf("data:")) {
            var b = a.indexOf("base64,");
            0 < b && (a = a.substr(b + 7))
        }
        a = a.replace(/(\r\n|\n|\r)/gm, "");
        a = atob(a);
        b = a.length;
        var c = new ArrayBuffer(b);
        c = new Uint8Array(c);
        for (var d = 0; d < b; d++) c[d] = a.charCodeAt(d);
        return c
    };
    window.scannerjs.fadeOut = Ga;
    window.scannerjs.hasJava = ra;
    window.scannerjs.hasWebSocketSupport = function() {
        var a = "WebSocket" in window && void 0 != window.WebSocket || "MozWebSocket" in window;
        a || W("WebSocket is not supported by this browser: " + P.name + " " + P.version);
        return a
    };
    window.scannerjs.isWindows = function() {
        if ("navigator" in window && void 0 != window.navigator && "platform" in window.navigator) return -1 < navigator.platform.indexOf("Win")
    };
    window.scannerjs.isHttps = function() {
        return "https:" == document.location.protocol
    };
    window.scannerjs.version = "2.11.0";
    window.scannerjs.MIME_TYPE_BINARY = "application/octet-stream";
    window.scannerjs.MIME_TYPE_BMP = "image/bmp";
    window.scannerjs.MIME_TYPE_GIF = "image/png";
    window.scannerjs.MIME_TYPE_JPEG = "image/jpeg";
    window.scannerjs.MIME_TYPE_PNG = "image/tiff";
    window.scannerjs.MIME_TYPE_PDF = "application/pdf";
    window.scannerjs.EVENT_LOADED = "loaded";
    window.scannerjs.EVENT_PRE_INIT = "pre-init";
    window.scannerjs.EVENT_POST_INT = "post-init";
    window.scannerjs.EVENT_FUNC_CALL = "func-call";
    window.scannerjs.EVENT_FUNC_CANCELLED = "func-cancelled";
    window.scannerjs.EVENT_FUNC_RETURN = "func-return";
    window.scannerjs.EVENT_READY = "ready";
    window.scannerjs.EVENT_FAILED_TO_CONNECT = "failed-to-connect";
    window.scannerjs.EVENT_FAILED_TO_CONNECT_FINAL = "failed-to-connect-final";
    window.scannerjs.EVENT_DISCONNECTED = "disconnected";
    window.scannerjs.LOG_LEVEL_INFO = 4;
    window.scannerjs.LOG_LEVEL_ERROR = 16;
    window.scannerjs.LOG_LEVEL_ALL = 0;
    window.scannerjs.LOG_LEVEL_OFF = 1024;
    window.scannerjs.getIsInitialized = function() {
        return H
    };
    window.scannerjs.getIsReady = function() {
        return K
    };
    window.scannerjs.isConnectedToScanWebSocket = V;
    window.scannerjs.ScannedImage = m;
    window.scannerjs.ScannedImage.prototype.getMimeType = m.prototype.v;
    window.scannerjs.ScannedImage.prototype.getSrcIsBase64 = m.prototype.w;
    window.scannerjs.ScannedImage.prototype.getImageInfo = m.prototype.s;
    window.scannerjs.ScannedImage.prototype.getInfo = m.prototype.u;
    window.scannerjs.ScannedImage.prototype.getWidth = m.prototype.h;
    window.scannerjs.ScannedImage.prototype.getHeight = m.prototype.f;
    window.scannerjs.ScannedImage.prototype.isColor = m.prototype.j;
    window.scannerjs.ScannedImage.prototype.isGray = m.prototype.l;
    window.scannerjs.ScannedImage.prototype.isBlackWhite = m.prototype.i;
    window.scannerjs.ScannedImage.prototype.getResolution = m.prototype.g;
    window.scannerjs.ScannedImage.prototype.getBitsPerPixel = m.prototype.c;
    window.scannerjs.ScannedImage.prototype.getBase64NoPrefix = m.prototype.o;
    window.scannerjs.ScannedImage.prototype.toString = m.prototype.toString;
    "scanner" in window || (window.scanner = window.scannerjs);
    "ScannedImage" in window || (window.ScannedImage = window.scannerjs.ScannedImage);
    window && (window.addEventListener ? window.addEventListener("load", function() {
        ia && M()
    }) : window.attachEvent && window.attachEvent("onload", function() {
            ia && M()
        }));
    try {
        J && J("loaded")
    } catch (a) {};
}).call(window);